/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Actividad;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import sv.com.compassion.entidades.Aula;
import sv.com.compassion.entidades.Rangoedad;
import sv.com.compassion.entidades.Tipoactividad;
import sv.com.compassion.entidades.Tutor;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;



/** Se define la interacción del mantenimiento Actividades
 * @author geovany
*/

public class ActividadAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Actividad actividad;
    private String nomAct;
    private String fecFin;
    private String idRangoEdad;
    private String idTipoAct;
    private String idAula;
    private String idTutor;
    private String cdis;
    private String VERhis;
    private String formaBus;
/**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Actividad. 
 */
 
public ActividadAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        actividad = new    Actividad();
        
        actividad.setIdAula(new Aula());
        actividad.setIdTipoActividad(new Tipoactividad());
        actividad.setIdTutor(new Tutor());
        actividad.setIdranEdad(new Rangoedad());
}   

/**
 * Busca el método que se ejecutara
 */
    @Override
    public String execute(){
        buscarMetodo(actividad);        
        return null;
    }
 /**
 * @param objeto de la entidad Actividad
 * Inserta una nueva actividad a la entidad Actividad
 */    
    @Override    
    public void agregarEntidad(Object o) {
        Actividad a;
        try{
            Date    date    =   new Date();
            a = (Actividad)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
            a.setAuAddUsr(Integer.parseInt(idUsuario));
            a.setAuAddDat(date);

            genericoDAO.save(a);
        }catch(Exception e){
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Actividad
 * Actualiza a inactivo el registro que se mapea en el parámetro Object
 */ 
        @Override
    public void borrarEntidad(Object o) {
        List<Actividad> listAct;
        Actividad a;
        try{
            if(getId()!=null){
                listAct = genericoDAO.find("select  a FROM Actividad a where a.idActividad = "+getId(), null, null);
                if(!listAct.isEmpty()){
                    a = listAct.get(0);
                    a.setEstActividad(-1);
                    genericoDAO.update(a);
                }
            }            
        }catch(Exception e){
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Actividad
 * Actualiza el registro que se recibe de parámetro
 */             
    @Override
    public void editarEntidad(Object o) {
        Actividad a;
        try{
            Date    date    =   new Date();
            a = (Actividad)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
            a.setIdActividad(new Integer(getId()));
            setIdAula(a.getIdAula().getIdAula());
            setIdTipoActividad(a.getIdTipoActividad().getIdTipoActividad());
            setIdTutor(a.getIdTutor().getIdTutor());
            setIdranEdad(a.getIdranEdad().getIdRangoEdad());
            
            setAuModUsr(Integer.parseInt(idUsuario));
            setAuModDat(date);
            
            genericoDAO.update(a);
        }catch(Exception e){
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
    
    
 /**
 * Este método hace las búsquedas de Actividades para llenar el grid del mantenimiento
 * esperando los valores de los filtros:
 *       nomAct,
 *       fecFin, 
 *       idAula, 
 *       idTutor,
 *       idRangoEdad, 
 *       idTipoAct, 
 *       cdis, 
 *       VERhis
 */      
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        
        List<Actividad> listaActividad = null;
        String query="";
        nomAct = getRequest().getParameter("NomAct");
        fecFin = getRequest().getParameter("FecFin");
        idAula = getRequest().getParameter("IdAula");
        idTutor = getRequest().getParameter("IdTutor");
        idRangoEdad = getRequest().getParameter("IdRangoEdad");
        idTipoAct = getRequest().getParameter("IdTipoAct");
        cdis = getRequest().getParameter("IdCdi");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        String nomActquery = "";
        String queryFechaFin = "";
        String queryIdAula = "";
        String queryIdTutor = "";
        String queryIdRangoEdad = "";
        String queryIdTipoAct = "";
        String queryCdi = "";
        String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "a.idTutor IN (SELECT t.idTutor FROM Tutor t WHERE t.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
        }
        nomActquery = "a.nomActividad like upper('%" + nomAct + "%') ";
        if(!fecFin.equals("") || !idAula.equals("") || !idTutor.equals("") || !idRangoEdad.equals("") || !idTipoAct.equals("") || !cdis.equals("")){
            if(!fecFin.equals("")){
                queryFechaFin = "and a.fecFinalizacion = '" + fecFin + "' ";
            }
            if(!idAula.equals("")){
                    queryIdAula = "and a.idAula  = '" + idAula + "' ";
            }
            if(!idTutor.equals("")){
                queryIdTutor = "and a.idTutor  = '" + idTutor + "' ";
            }
            if(!idRangoEdad.equals("")){
                queryIdRangoEdad = "and a.idranEdad = '" + idRangoEdad + "' ";
            }
            if(!idTipoAct.equals("")){
                queryIdTipoAct = "and a.idTipoActividad = '" + idTipoAct + "' ";
            }
            if(!cdis.equals("")){
                queryCdi = "and a.idTutor IN (SELECT t.idTutor FROM Tutor t WHERE t.idCdi = '" + cdis + "') ";
            }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        try{
                if(getSearch()!= null && getSearch().equals("true")){
                    query = "SELECT a FROM Actividad a  where";
                    
                    if(getNomActividad()!=null){
                        query += " upper(a.nomActividad) like upper('%"+ getNomActividad() +"%') and  ";
                    }
                    if(getDesActividad()!=null){
                        query += " upper(a.desActividad) like upper('%"+getDesActividad()+"%') and  ";
                    }
                    if(getFecFinalizacion()!=null){
                        query += " a.fecFinalizacion = '"+Fecha.date2String(Fecha.string2Date(getFecFinalizacion()),"yyyy-MM-dd")+"' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by a.fecFinalizacion "+getSord();
                    listaActividad = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                }else{
                    query = "SELECT a FROM Actividad a WHERE " +
                                queryAux + 
                                nomActquery +
                                queryFechaFin +
                                queryIdAula +
                                queryIdTutor +
                                queryIdRangoEdad +
                                queryIdTipoAct + 
                                queryCdi +
                                "and (a.estActividad like upper('" + verHistorial + "') or "
                                + "a.estActividad like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY a.nomActividad " + getSord();
                }
                if(formaBus.equals("1")){ 
                }else{
                        listaActividad = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                        query = "SELECT COUNT(a) FROM Actividad a WHERE " +
                                queryAux + 
                                nomActquery +
                                queryFechaFin +
                                queryIdAula +
                                queryIdTutor +
                                queryIdRangoEdad +
                                queryIdTipoAct + 
                                queryCdi +
                                "and (a.estActividad like upper('" + verHistorial + "') or "
                                + "a.estActividad like upper('" + verHistorialTemp + "'))";
                        total = genericoDAO.countRow(query);
                        //configuraciones basicas
                        jg.setPage(getPage());
                        jg.setRecords(total);
                        jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                        jg.setSord(getSord());
                        jg.setSidx(getSidx());
                        List<RowsGrid> rows = new ArrayList<RowsGrid>();

                        for(Actividad a: listaActividad){
                            RowsGrid r = new RowsGrid(); 
                            r.setId(a.getIdActividad().toString());
                            List cell = new ArrayList();

                            cell.add(a.getNomActividad());
                            cell.add(a.getDesActividad());

                            if(a.getEstActividad() == 1){
                                cell.add("Activo");
                            }else{
                                cell.add("Inactivo");
                            }

                            cell.add(a.getIdTipoActividad().getIdTipoActividad());
                            cell.add(a.getIdTipoActividad().getNomActividad());

                            cell.add(a.getIdranEdad().getIdRangoEdad());
                            cell.add(a.getIdranEdad().getNomRangoEdad());

                            cell.add(a.getIdAula().getIdAula());
                            cell.add(a.getIdAula().getNomAula());

                            cell.add(a.getIdTutor().getIdTutor());
                            cell.add(a.getIdTutor().getNomTutor());
                            cell.add(a.getIdTutor().getApeTutor());

                            if(a.getFecFinalizacion() == null){
                                cell.add("");
                            }else{
                                cell.add(a.getFecFinalizacion().toString());
                            }    

                            cell.add(a.getAuAddUsr());
                            cell.add(a.getAuAddDat().toString());

                            r.setCell(cell);
                            rows.add(r);                    
                        }


                        jg.setRows(rows);
                        JSONObject jo = JSONObject.fromObject(jg);
                        enviarJsonNavegador(getResponse(), jo);
                }       
        }catch(Exception e){
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 public Integer getIdActividad() {
        return actividad.getIdActividad();
    }

    public void setIdActividad(Integer idActividad) {
        actividad.setIdActividad(idActividad);
    }

    public String getNomActividad() {
        return actividad.getNomActividad();
    }

    public void setNomActividad(String nomActividad) {
        actividad.setNomActividad(nomActividad);
    }

    public String getDesActividad() {
        return actividad.getDesActividad();
    }

    public void setDesActividad(String desActividad) {
        actividad.setDesActividad(desActividad);
    }

    public int getEstActividad() {
        return actividad.getEstActividad();
    }

    public void setEstActividad(int estActividad) {
        actividad.setEstActividad(estActividad);
    }

    public String getFecFinalizacion() {
        return Fecha.date2String(actividad.getFecFinalizacion());
    }

    public void setFecFinalizacion(String fecFinalizacion) {
        try{ 
            if(fecFinalizacion!=null && !fecFinalizacion.equals("")){
                actividad.setFecFinalizacion(Fecha.string2Date(fecFinalizacion));
            }    
        } catch (ParseException ex) {
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuAddUsr() {
        return actividad.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        actividad.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(actividad.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            if(auAddDat!=null && !auAddDat.equals("")){
                actividad.setAuAddDat(Fecha.string2Date(auAddDat));
            }    
        } catch (ParseException ex) {
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return actividad.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        actividad.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return actividad.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        actividad.setAuModDat(auModDat);
    }

    public Integer getIdTutor() {
        return actividad.getIdTutor().getIdTutor();
    }

    public void setIdTutor(Integer idTutor) {
        actividad.getIdTutor().setIdTutor(idTutor);
    }

    public Integer getIdTipoActividad() {
        return actividad.getIdTipoActividad().getIdTipoActividad();
    }

    public void setIdTipoActividad(Integer idTipoActividad) {
        actividad.getIdTipoActividad().setIdTipoActividad(idTipoActividad);
    }

    public Integer getIdranEdad() {
        return actividad.getIdranEdad().getIdRangoEdad();
    }

    public void setIdranEdad(Integer idranEdad) {
        actividad.getIdranEdad().setIdRangoEdad(idranEdad);
    }

    public Integer getIdAula() {
        return actividad.getIdAula().getIdAula();
    }

    public void setIdAula(Integer idAula) {
        actividad.getIdAula().setIdAula(idAula);
    }
 /**
 * Se utiliza para generar el reporte de los registros de Actividades
 */     
    @Override
    public void reporteXls() {
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            

                // capturamos la direccion absoluta de la plantilla del reporte en el servidor 
            //    String path = getServlet().getServletContext().getRealPath("/xlt/reporteConsolidadoSMS.xlt");
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportActividad.xlt");
                FileInputStream stream = new FileInputStream(ruta); // obtenemos al archivo
                libro = new HSSFWorkbook(stream);      // el libro de trabajo

                response.setHeader("Pragma", "cache");          // Para mostrar ventana de apertura del archivo
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportActividad.xls");
        
                libro = generarExcel(libro); 

                libro.write(out);
                out.flush();
                out.close();
        }catch(Exception e){
          e.printStackTrace();
        }         
    }
 /**
 * @param book un objeto de tipo HSSFWorkbook, permite recibir el libro de excel.
 * este además recibe como filtros:
 *       nomAct,
 *       fecFin, 
 *       idAula, 
 *       idTutor,
 *       idRangoEdad, 
 *       idTipoAct, 
 *       cdis, 
 *       VERhis <br>
 * @return  book ya completo con los datos que se desea expulsar
 */     
 private HSSFWorkbook generarExcel(HSSFWorkbook book) {
          /**
     * EL ESTILO DEL REPORTE
     */
      HSSFCellStyle styleBordere = book.createCellStyle();
      HSSFFont fontReport = book.createFont();
      fontReport.setFontName("Arial");
      fontReport.setFontHeightInPoints((short)10);
      styleBordere.setFont(fontReport);
      styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
      styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
      styleBordere.setBorderRight(styleBordere.BORDER_THIN);
      styleBordere.setBorderTop(styleBordere.BORDER_THIN);
      styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      
      List<Actividad> listaActividad = null;
      
      HSSFSheet sheet = book.getSheet("Hoja1"); //nombre de la hoja 
      HSSFRow row = sheet.getRow(1);
      HSSFCell celda = null;
      Date      today    =   new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy");
    //  String    ahora   =   ;
      row = sheet.createRow(3);
      celda = row.createCell(7);
      celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
      celda.setCellStyle(styleBordere);
      int col = 1;
      int fila  = 10;
      nomAct = getRequest().getParameter("NomAct");
      fecFin = getRequest().getParameter("FecFin");
      idAula = getRequest().getParameter("IdAula");
      idTutor = getRequest().getParameter("IdTutor");
      idRangoEdad = getRequest().getParameter("IdRangoEdad");
      idTipoAct = getRequest().getParameter("IdTipoAct");
      cdis = getRequest().getParameter("IdCdi");
      VERhis = getRequest().getParameter("VERhis");
      
      Map session = ActionContext.getContext().getSession();
      String idUsuario = session.get("idUsuario").toString();
      String idCargo = session.get("idCargo").toString();
      
      try{
      
          String query = "SELECT a FROM Actividad a  where";
          if(idRangoEdad!=null&&!idRangoEdad.toString().equals("")){
                query += " a.idranEdad = "+idRangoEdad+" and  ";
          }
          if(idTipoAct!=null&&!idTipoAct.toString().equals("")){
                query += " a.idTipoActividad = "+idTipoAct+" and  ";
          }   
          if(idAula!=null&&!idAula.toString().equals("")){
                query += " a.idAula = "+idAula+" and  ";
          }
          if(idTutor!=null&&!idTutor.toString().equals("")){
                query += " a.idTutor = "+idTutor+" and  ";
          }         
          if(fecFin!=null&&!fecFin.toString().equals("")){ 
                query += " a.fecFinalizacion = '" + fecFin + "' and  ";
          }      
          if(nomAct!=null&&!nomAct.toString().equals("")){
            query += " upper(a.nomActividad) like upper('%"+ nomAct +"%') and  ";
          }
          if(cdis!=null && !cdis.equals("")){
            query += " a.idTutor IN (SELECT t.idTutor FROM Tutor t WHERE t.idCdi = '" + cdis + "') and  ";
          }
          if(VERhis == null || !VERhis.equals("true")){
            query += " a.estActividad = 1    and  "; 
          }
        /*  if(desc!=null&&!desc.toString().equals("")){
            query += " upper(a.desActividad) like upper('%"+desc+"%') and  ";
          }*/
          if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            List<Tutor> listaTutor = null;
            String tutores = "";
            String sql = " Select t from Tutor t where t.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "') ";
            listaTutor = genericoDAO.find(sql,null,null);
            for(Tutor t : listaTutor){
                tutores += ","+t.getIdTutor().toString();
            }
            query  += " a.idTutor IN ("+tutores.substring(1, tutores.length())+")          ";
          }
          query = query.substring(0, query.length()-5)+" order by a.fecFinalizacion ";
          listaActividad = genericoDAO.find(query,null,null);
         // listaActividad = genericoDAO.find(query,null,null);

          for(Actividad a: listaActividad){

                col = 1;
                row = sheet.createRow(fila);

                celda = row.createCell(col++);
                celda.setCellValue(new HSSFRichTextString(String.valueOf(a.getNomActividad())));
                celda.setCellStyle(styleBordere);

                celda = row.createCell(col++);
                celda.setCellValue(new HSSFRichTextString(String.valueOf(a.getDesActividad())));
                celda.setCellStyle(styleBordere);

                celda = row.createCell(col++);
                celda.setCellValue(new HSSFRichTextString(String.valueOf(a.getIdTipoActividad().getNomActividad())));
                celda.setCellStyle(styleBordere);

                celda = row.createCell(col++);
                celda.setCellValue(new HSSFRichTextString(a.getIdranEdad().getNomRangoEdad()));
                celda.setCellStyle(styleBordere);

                celda = row.createCell(col++);
                if(a.getIdAula().getNomAula() != null){
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(a.getIdAula().getNomAula())));
                }else{
                    celda.setCellValue(new HSSFRichTextString(String.valueOf("")));
                }    
                celda.setCellStyle(styleBordere);

                celda = row.createCell(col++);
                celda.setCellValue(new HSSFRichTextString(String.valueOf(a.getIdTutor().getNomTutor()+" "+a.getIdTutor().getApeTutor())));
                celda.setCellStyle(styleBordere);

                celda = row.createCell(col++);
                if(a.getFecFinalizacion() != null){
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(a.getFecFinalizacion()))));
                }else{
                    celda.setCellValue(new HSSFRichTextString(String.valueOf("")));
                }
                celda.setCellStyle(styleBordere);                         

                fila ++;
      }   
     }catch(Exception e){
         e.getMessage();
         return null;
     }
      return book;  
    }
            
}
